/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Copyright (c) 2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file has been modified by Huawei to verify type inference by adding verification statements.
*/

// === tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedInterfacesOfTheSameName.ts ===
declare function AssertType(value:any, type:string):void;
module A {
    export interface Point {
        x: number;
        y: number;
        toCarth(): Point;
    }
}

module A {
    export interface Point {
        fromCarth(): Point;
    }
}

// ensure merges as expected
let p: { x: number; y: number; toCarth(): A.Point; fromCarth(): A.Point; };
AssertType(p, "{ x: number; y: number; toCarth(): A.Point; fromCarth(): A.Point; }");
AssertType(x, "number");
AssertType(y, "number");
AssertType(toCarth, "() => A.Point");
AssertType(A, "any");
AssertType(fromCarth, "() => A.Point");
AssertType(A, "any");

let p: A.Point;
AssertType(p, "{ x: number; y: number; toCarth(): A.Point; fromCarth(): A.Point; }");
AssertType(A, "any");

module X.Y.Z {
    export interface Line {
        new (start: A.Point, end: A.Point);
    }
}

module X {
    export module Y.Z {
        export interface Line {
            start: A.Point;
            end: A.Point;
        }
    }
}

// ensure merges as expected
let l: { start: A.Point; end: A.Point; new (s: A.Point, e: A.Point); 
AssertType(l, "{ new (A.Point, A.Point): any; start: A.Point; end: A.Point; }");

AssertType(start, "A.Point");

AssertType(A, "any");

AssertType(end, "A.Point");

AssertType(A, "any");

AssertType(s, "A.Point");

AssertType(A, "any");

AssertType(e, "A.Point");

AssertType(A, "any");
}

let l: X.Y.Z.Line;
AssertType(l, "{ new (A.Point, A.Point): any; start: A.Point; end: A.Point; }");
AssertType(X, "any");
AssertType(Y, "any");
AssertType(Z, "any");


